home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / emulator / uae-0.000 / uae-0 / uae-0.6.0 / include / memory.h < prev    next >
C/C++ Source or Header  |  1996-06-12  |  3KB  |  152 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * memory management
  5.   * 
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. #define chipmem_size 0x200000
  10. #define bogomem_size 0x100000 /* C00000 crap mem */
  11. #define kickmem_size 0x080000
  12.  
  13. #define chipmem_start 0x000000
  14. #define bogomem_start 0xC00000 
  15. #define kickmem_start 0xF80000
  16.  
  17. extern int ersatzkickfile;
  18.  
  19. typedef ULONG (*lget_func)(CPTR) REGPARAM;
  20. typedef UWORD (*wget_func)(CPTR) REGPARAM;
  21. typedef UBYTE (*bget_func)(CPTR) REGPARAM;
  22. typedef void (*lput_func)(CPTR,ULONG) REGPARAM;
  23. typedef void (*wput_func)(CPTR,UWORD) REGPARAM;
  24. typedef void (*bput_func)(CPTR,UBYTE) REGPARAM;
  25. typedef UWORD *(*xlate_func)(CPTR) REGPARAM;
  26. typedef int (*check_func)(CPTR, ULONG) REGPARAM;
  27.  
  28. typedef struct {
  29.     lget_func lget;
  30.     wget_func wget;
  31.     bget_func bget;
  32.     lput_func lput;
  33.     wput_func wput;
  34.     bput_func bput;
  35.     xlate_func xlateaddr;
  36.     check_func check;
  37. } addrbank;
  38.  
  39. extern addrbank chipmem_bank;
  40. extern addrbank kickmem_bank;
  41. extern addrbank custom_bank;
  42. extern addrbank clock_bank;
  43. extern addrbank cia_bank;
  44. extern addrbank rtarea_bank;
  45. extern addrbank expamem_bank;
  46. extern addrbank fastmem_bank;
  47.  
  48. extern void rtarea_init (void);
  49. extern void expamem_init (void);
  50. extern void expamem_reset (void);
  51.  
  52. extern ULONG fastmem_size;
  53.  
  54.  
  55. /* Default memory access functions */
  56.  
  57. extern int default_check(CPTR addr, ULONG size) REGPARAM;
  58. extern UWORD *default_xlate(CPTR addr) REGPARAM;
  59.  
  60. extern addrbank membanks[65536];
  61. static __inline__ unsigned int bankindex(CPTR a)
  62. {
  63.     return a>>16;
  64. }
  65.  
  66. static __inline__ ULONG longget(CPTR addr)
  67. {
  68.     return membanks[bankindex(addr)].lget(addr);
  69. }
  70. static __inline__ UWORD wordget(CPTR addr)
  71. {
  72.     return membanks[bankindex(addr)].wget(addr);
  73. }
  74. static __inline__ UBYTE byteget(CPTR addr) 
  75. {
  76.     return membanks[bankindex(addr)].bget(addr);
  77. }
  78. static __inline__ void longput(CPTR addr, ULONG l)
  79. {
  80.     membanks[bankindex(addr)].lput(addr, l);
  81. }
  82. static __inline__ void wordput(CPTR addr, UWORD w)
  83. {
  84.     membanks[bankindex(addr)].wput(addr, w);
  85. }
  86. static __inline__ void byteput(CPTR addr, UBYTE b)
  87. {
  88.     membanks[bankindex(addr)].bput(addr, b);
  89. }
  90.  
  91. static __inline__ int check_addr(CPTR a)
  92. {
  93. #ifdef NO_EXCEPTION_3
  94.     return 1;
  95. #else
  96.     return (a & 1) == 0;
  97. #endif
  98. }
  99. extern int buserr;
  100.     
  101. extern void memory_init(void);    
  102. extern void map_banks(addrbank bank, int first, int count);
  103.     
  104. static __inline__ ULONG get_long(CPTR addr) 
  105. {
  106.     if (check_addr(addr))
  107.     return longget(addr);
  108.     buserr = 1;
  109.     return 0;
  110. }
  111. static __inline__ UWORD get_word(CPTR addr) 
  112. {
  113.     if (check_addr(addr))
  114.     return wordget(addr);
  115.     buserr = 1;
  116.     return 0;
  117. }
  118. static __inline__ UBYTE get_byte(CPTR addr) 
  119. {
  120.     return byteget(addr); 
  121. }
  122. static __inline__ void put_long(CPTR addr, ULONG l) 
  123. {
  124.     if (!check_addr(addr))
  125.     buserr = 1;
  126.     longput(addr, l);
  127. }
  128. static __inline__ void put_word(CPTR addr, UWORD w) 
  129. {
  130.     if (!check_addr(addr))
  131.     buserr = 1;
  132.     wordput(addr, w);
  133. }
  134. static __inline__ void put_byte(CPTR addr, UBYTE b) 
  135. {
  136.     byteput(addr, b);
  137. }
  138.  
  139. static __inline__ UWORD *get_real_address(CPTR addr)
  140. {
  141.     if (!check_addr(addr))
  142.     buserr = 1;
  143.     return membanks[bankindex(addr)].xlateaddr(addr);
  144. }
  145.  
  146. static __inline__ int valid_address(CPTR addr, ULONG size)
  147. {
  148.     if (!check_addr(addr))
  149.     buserr = 1;
  150.     return membanks[bankindex(addr)].check(addr, size);
  151. }
  152.